home *** CD-ROM | disk | FTP | other *** search
- /*
- * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
- *
- * @APPLE_LICENSE_HEADER_START@
- *
- * The contents of this file constitute Original Code as defined in and
- * are subject to the Apple Public Source License Version 1.1 (the
- * "License"). You may not use this file except in compliance with the
- * License. Please obtain a copy of the License at
- * http://www.apple.com/publicsource and read it before using this file.
- *
- * This Original Code and all software distributed under the License are
- * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
- * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
- * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
- * License for the specific language governing rights and limitations
- * under the License.
- *
- * @APPLE_LICENSE_HEADER_END@
- */
- /*
- * MPEnabler - An example of patching funtions in the Mac OS X Kernel
- *
- * Yes, I know that I said you don't patch functions in kernel,
- * but you should remember what your mother used to say,
- *
- * "Do and I say, not as I do."
- *
- * Josh de Cesare, MacHack 2000
- */
-
-
- #include <ppc/asm.h>
-
- .globl _PatchItHelper
-
- _PatchItHelper:
- // Create a stack frame.
- // Don't squash r0.
- stmw r28, -0x10(r1)
- mflr r28
- stw r28, 0x8(r1)
- stwu r1, -0x50(r1)
-
- // Save the patch pointer
- mr r28, r0
-
- // Save arg0 in the patch data.
- stw r3, 0x0(r28)
-
- // Call the new function where arg0
- // is the patch pointer.
- lwz r3, 0x8(r28)
- mtctr r3
- mr r3, r28
- bctrl
-
- // Clean up the stack frame.
- addi r1, r1, 0x50
- lwz r0, 0x8(r1)
- mtlr r0
- lmw r28, -0x10(r1)
- blr
-
-
- .globl _PatchItStub
-
- _PatchItStub:
- lis r0, 0
- ori r0, r0, 0
- mtctr r0
- lis r0, 0
- ori r0, r0, 0
- bctr
-
- .globl _PatchItFlush
-
- _PatchItFlush:
- dcbst 0, r3
- sync
- icbi 0, r3
- sync
- isync
- blr
-